Computing devices now commonly use co-processors for performing specialized tasks. To cite one example, a general-purpose computing device may include a general-purpose central processing unit (CPU) in combination with a specialized graphics processing unit (GPU). The GPU may perform computation-intensive tasks associated with the execution of a game or other graphics-intensive application. A developer may provide an application which runs on an operating system which provides access to the general-purpose CPU of the computing device. If the application invokes processes which involve access to a co-processor, the computing device typically provides such access through a driver interface using a well-defined protocol.
Co-processors represent rich processing resources, yet there are a number of challenges involved in extending the use of co-processors for more general-purpose applications. For example, a co-processor and a general-purpose CPU may use different instruction set architectures (ISAs). Further, the co-processor and general-purpose CPU may have access to different respective sets of resources. Further, a rigid protocol may govern the manner in which the co-processor interacts with the general purpose CPU. This protocol may make it difficult for the co-processor to access the resources of the CPU in a non-standard manner, and vice versa. Generally, these factors complicate any attempt to integrate the co-processor with more general purpose operations performed by the computing device.